/**
 * 用法 <input name="id" allow="notnull" tip="必填"/> ps:input的父级节点为相对对位
 * name,allow,tip 三个属性石必须的。
 * allow的值目前支持：
 * 1 ：notnull     校验不全是空格
 * 2 ：email       邮箱
 * 3 ：eng		   英文
 * 4 ：chn		   中文
 * 5 ：eng		   英文
 * 6 ：reg			自定义正则  格式为 allow = "reg:正则表达式&&提示内容"，自定义正则不需要写前后的斜杠，直接写，第二个是提示信息
 * 7 ：between		between:1,2 数组为两个值域
 * 8 ：eq 		eq:需要比较的name&&提示信息
 * @param formid
 * 
 */

function checkFormInput(formid) {
	var checkArray = new Array();
	var i = 0;
	$("#"+formid+" :input").each(function() {
		var check = true;
		var style = $(this).attr('style');
		var display = $(this).attr('display');
		
		if(style && (style.indexOf('none')!=-1)) {
			check = false;
		}
		if('none' == display) {
			check = false;
		}
		if(check && $(this).attr('allow')) {
			checkArray[i]={name:$(this).attr('name'),type:$(this).attr('allow'),
							rightMsg:"填写正确",focusMsg:$(this).attr('tip'),
							errorMsg:"输入错误，"+$(this).attr('tip'),rightMsg:"填写正确"};
				i++;	
		}

	});
	$("#"+formid+"").checkInput({inputs:checkArray});
}
(function($){
	var regulars = {
			"email"    	: [/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/,"格式不对"],
			"eng"	   	: [/^[A-Za-z]+$/,"只能输入英文"],
			"chn" 		: [/^[\u0391-\uFFE5]+$/,"只能输入汉字"],
			"mobile"	:[/^1\d{10}$/,"手机格式错误"],
			"notnull"	:[/^[\s\S]{1,200}$/,"不能为空,且长度小于200"],
			"length"	:[/^[\s\S]{0,200}$/,"长度超过限制"],
			"int"		:[/^-?\d+$/,"只能整数"],
			"double"	:[/^(-?\d+)(\.\d+)?/,"只能输入数字"],
		};
		
	tipStatu = function(type,inp,msg){
    	inp.data("tip").
    		removeClass("focus_tip right_tip error_tip ajax_checking_tip").
    		addClass(type+"_tip").
    		html(msg?msg:"").
    		css({
        		"position" 	: "absolute",
        		"top"		: inp.position().top,
        		"left"		: inp.position().left + inp.outerWidth() + 18
        	});
    }	
	/*相等匹配*/
	checkEq = function(set,inp,thiz){
		if(set.type=="eq" && set.eqto){
			if((inp.val() == inp.parents("form").find("[name='"+set.eqto +"']").val())){
    			tipStatu("right",inp,set.rightMsg);
    			return true;
    		}else{
    			tipStatu("error",inp,set.errorMsg);
    			return false;
    		}
		}else{return true;}
	}
	/*between检查*/
	checkBet = function(set,inp){
		if(set.between){
			var bet = set.between;
			if(inp.val()>=set.between[0] && inp.val() <=set.between[1]){
				tipStatu("right",inp,set.rightMsg);
				return true;
			}else{
    			tipStatu("error",inp,set.errorMsg);
    			return false;
			}
		}else{return true;}
	}
	/*正则匹配*/
	checkReg = function(set,inp){		
		if(regulars[set.type]){
			var reg = regulars[set.type];
			if(reg[0].test(inp.val())){
				tipStatu("right",inp,set.rightMsg);
				return true;
			}else{
				tipStatu("error",inp,reg[1]);
				return false;
			}
		}else{return true;}
	}
	/*ajax checking*/
	ajaxCheck = function(set,inp){
		if(set.ajax){
			var ajax = set.ajax,result = false;
			$.ajax({
				url:ajax.url,
				type:"post",
				data:inp.attr("name")+"="+inp.val(),
				dataType:"text",
				timeout:5000,
				async:false,
				before:function(){tipStatu("ajax_check",inp);},
				success:function(d){
					if(d == 1){
						tipStatu("right",inp,ajax.successMsg);
						result = true;
					}else if(d == 0){
						tipStatu("error",inp,ajax.errorMsg);
						result = false;
					}else{result = false;}
				},
				error:function(){
					tipStatu("error",inp,"网络出错");
					result = false;
				}
			});
			return result;
		}else{return true;}
	}
	/*初始化（每个input的）验证环境*/
	// initContext = function(inp,it){
    	// if(!inp.data("tip") && inp.attr("name") && it[inp.attr("name")]){
    		// var tip = $("<span class='input_tip'></span>");
    		// inp.data("tip",tip).data("set",it[inp.attr("name")]);
    		// inp.after(tip);
    	// }
	// }
	/*检查输入*/
	checkIn = function(inp,form){
		if(inp.data("tip")){
			var set = inp.data("set");
    		return (checkReg(set,inp) && checkEq(set,inp,form) && checkBet(set,inp) && ajaxCheck(set,inp));
		}else{
			return true;
		}
	}
	
	
	$.fn.checkInput = function(settings){
		var dfs={
            inputs:[],
            regulars:{},
            button:"",
            onButtonClick:$.noop,
            beforeSubmit:$.noop,
            checkAll:$.noop
        };
		
        var sets = $.extend(true,dfs,settings);
        var it = {};
    	$.each(sets.inputs,function(i,n){it[n.name] = n;});
    	
    	regulars = $.extend(true,regulars,sets.regulars);
        var thiz = $(this);
       /*失焦提示*/
        // this.delegate("input,textarea","blur",function(){
        	// checkIn($(this),thiz);
        // });  
        
        /*聚焦提示*/
         this.delegate("input,textarea","focus",function(evt){
        	 // initContext($(this),it);
        	 // var set = $(this).data("set");
        	 // if($(this).data("tip") && set.focusMsg){
        		// // tipStatu("focus",$(this),set.focusMsg);
        	 // }
        });
        /*提交表单*/
        this.submit(function(e){
        	var result = true;
        	var form = $(e.target);
        	$.each(form.find("input,texteare"),function(i,n){
        		initContext($(n),it);
            	result = (checkIn($(n),thiz) && result);
        	});
        	if(!result) e.preventDefault();
        	sets.beforeSubmit(e,result,form);
        }); 
        /*如果指定了一个响应事件的元素，则在该元素被点击时执行此方法*/
        if(sets.button){
        	this.delegate(sets.button,"click",function(e){
        		var result = true;
        		$.each(thiz.find("input,texteare"),function(i,n){
        			initContext($(n),it);
                	result = (checkIn($(n),thiz) && result);
        		});
        		sets.onButtonClick($(this),thiz,result);
        	});
        }
       
        return this;
	}
})(jQuery);

/**
 * 常用正则
验证数字的正则表达式集 
验证数字：^[0-9]*$
验证n位的数字：^\d{n}$
验证至少n位数字：^\d{n,}$
验证m-n位的数字：^\d{m,n}$
验证零和非零开头的数字：^(0|[1-9][0-9]*)$
验证有两位小数的正实数：^[0-9]+(.[0-9]{2})?$
验证有1-3位小数的正实数：^[0-9]+(.[0-9]{1,3})?$
验证非零的正整数：^\+?[1-9][0-9]*$
验证非零的负整数：^\-[1-9][0-9]*$
验证非负整数（正整数 + 0）  ^\d+$
验证非正整数（负整数 + 0）  ^((-\d+)|(0+))$
验证长度为3的字符：^.{3}$
验证由26个英文字母组成的字符串：^[A-Za-z]+$
验证由26个大写英文字母组成的字符串：^[A-Z]+$
验证由26个小写英文字母组成的字符串：^[a-z]+$
验证由数字和26个英文字母组成的字符串：^[A-Za-z0-9]+$
验证由数字、26个英文字母或者下划线组成的字符串：^\w+$
验证用户密码:^[a-zA-Z]\w{5,17}$ 正确格式为：以字母开头，长度在6-18之间，只能包含字符、数字和下划线。
验证是否含有 ^%&',;=?$\" 等字符：[^%&',;=?$\x22]+
验证汉字：^[\u4e00-\u9fa5],{0,}$
验证Email地址：^\w+[-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
验证InternetURL：^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ ；^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$
验证电话号码：^(\(\d{3,4}\)|\d{3,4}-)?\d{7,8}$：--正确格式为：XXXX-XXXXXXX，XXXX-XXXXXXXX，XXX-XXXXXXX，XXX-XXXXXXXX，XXXXXXX，XXXXXXXX。
验证身份证号（15位或18位数字）：^\d{15}|\d{}18$
验证一年的12个月：^(0?[1-9]|1[0-2])$ 正确格式为：“01”-“09”和“1”“12”
验证一个月的31天：^((0?[1-9])|((1|2)[0-9])|30|31)$    正确格式为：01、09和1、31。
整数：^-?\d+$
非负浮点数（正浮点数 + 0）：^\d+(\.\d+)?$
正浮点数   ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
非正浮点数（负浮点数 + 0） ^((-\d+(\.\d+)?)|(0+(\.0+)?))$
负浮点数  ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
浮点数  ^(-?\d+)(\.\d+)?
 */

